home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / crh_n.arc / NANSI_F.ORG < prev    next >
Text File  |  1986-05-15  |  17KB  |  667 lines

  1.     page    66, 132
  2. ;----- nansi_f.asm ---------------------------------------------
  3. ; The ANSI control subroutines.
  4. ; (C) 1986 Daniel Kegel, Pasadena, CA
  5. ; May be distributed for educational and personal use only
  6. ; Each routine is called with the following register usage:
  7. ;  AX = max(1, value of first parameter)
  8. ;  Z flag is set if first parameter is zero.
  9. ;  CX = number of paramters
  10. ;  SI = offset of second parameter from CS
  11. ;  DS = CS
  12. ;  ES:DI points to the current location on the memory-mapped screen.
  13. ;  DX is number of characters remaining on the current screen line.
  14.  
  15. ; The control routine is free to trash AX, BX, CX, SI, and DS.
  16. ; It must preserve ES, and can alter DX and DI if it wants to move the
  17. ; cursor.
  18. ;
  19. ; Revisions:
  20. ;  19 Aug 85: Fixed horrible bug in insert/delete line.
  21. ;  26 Aug 85: Fixed simple limit-to-one-too-few-lines bug in ins/del line;
  22. ;  anyway, it inserts 24 lines when on line 2 now.  Whether it's fixed...
  23. ;  4 Sept 85: Fixed bug created on 26 Aug 85; when limiting ins/del line
  24. ;  count, we are clearing, not scrolling; fixed BIOS call to reflect this.
  25. ;  30 Jan 86: Added EGA cursor patch
  26. ;  31 Jan 86: Disabled insert/delete char in graphics modes
  27. ;          Implemented keyboard redefinition reset
  28. ;  1 Feb 86: added video_mode and max_x test after mode set
  29. ;----------------------------------------------------------------
  30.  
  31.     include nansi_d.asm
  32.  
  33.     ; To nansi_p.asm
  34.     public    ansi_fn_table
  35.  
  36.  
  37.     ; From nansi.asm
  38.     extrn    port_6845:word
  39.     extrn    cur_coords:word, saved_coords:word
  40.     extrn    cur_x:byte, max_x:byte
  41.     extrn    cur_y:byte, max_y:byte
  42.     extrn    cur_attrib:byte, wrap_flag:byte
  43.     extrn    xy_to_regs:near
  44.     extrn    get_blank_attrib:near
  45.     extrn    xlate_tab_ptr:word
  46.     extrn    cpr_esc:byte, cprseq:word
  47.     extrn    video_mode:byte
  48.     extrn    lookup:near
  49.     extrn    in_g_mode:near
  50.  
  51.     ; from nansi_p.asm
  52.     extrn    param_buffer:word    ; used in keyboard programming
  53.     extrn    param_end:word
  54.     extrn    redef_end:word
  55.  
  56. keybuf    struc                ; used in making cpr sequence
  57. len    dw    ?
  58.  
  59. adr    dw    ?
  60. keybuf    ends
  61.  
  62.  
  63. ABS40    segment at 40h
  64.     org    1ah
  65. buffer_head    dw    ?    ; Used in 'flush input buffer' dos call.
  66. buffer_tail    dw    ?
  67.  
  68.     org    49h
  69. crt_mode    db    ?
  70. crt_cols    dw    ?
  71. crt_len        dw    ?
  72. crt_start    dw    ?
  73. cursor_posn    dw    8 dup (?)
  74. cursor_mode    dw    ?
  75. active_page    db    ?
  76. addr_6845    dw    ?
  77. crt_mode_set    db    ?
  78. crt_palette    db    ?
  79.  
  80.  
  81. ABS40    ends
  82.  
  83. code    segment byte public 'CODE'
  84.     assume cs:code, ds:code
  85.  
  86. ;----- byteout ---------------------------------------------------
  87. ; Converts al to a decimal ASCII string (in 0..99),
  88. ; stores it at ES:DI++.  Returns DI pointing at byte after last digit.
  89. ; Destroys DL.
  90.  
  91. byteout proc    near
  92.     aam
  93.     add    ax, 3030h
  94.     xchg    ah, al
  95.     stosb
  96.     xchg    ah, al
  97.     stosb
  98.     ret
  99. byteout endp
  100.  
  101. ;----- ansi_fn_table -----------------------------------
  102.  
  103. ; Table of offsets of terminal control subroutines in order of
  104. ; the character that invokes them, @..Z, a..z.    Exactly 53 entries.
  105. ; All the subroutines are defined below in this module.
  106. ansi_fn_table    label    word
  107.     dw    ic,  cup, cdn, cfw, cbk        ; @, A, B, C, D
  108.     dw    nul, nul, nul, hvp, nul        ; E, F, G, H, I
  109.     dw    eid, eil, il,  d_l, nul        ; J, K, L, M, N
  110.     dw    nul, dc,  nul, nul, nul        ; O, P, Q, R, S
  111.     dw    nul, nul, nul, nul, nul        ; T, U, V, W, X
  112.     dw    nul, nul            ; Y, Z
  113.     dw    nul, nul, nul, nul, nul        ; a, b, c, d, e
  114.     dw    hvp, nul, sm,  nul, nul        ; f, g, h, i, j
  115.     dw    nul, rm,  sgr, dsr, nul        ; k, l, m, n, o
  116.     dw    key, nul, nul, scp, nul        ; p, q, r, s, t
  117.     dw    rcp, nul, nul, nul, xoc        ; u, v, w, x, y
  118.     dw    nul                ; z
  119.  
  120. ansi_functions    proc    near        ; set return type to NEAR
  121.  
  122. ;----- nul ---------------------------------------------
  123. ; No-action ansi sequence; called when unknown command given.
  124.  
  125. nul:    ret
  126.  
  127. ;----- Cursor Motion -----------------------------------------------
  128.  
  129. ;-- cursor to y,x
  130. hvp:    or    al, al        ; First parameter is desired Y coordinate.
  131.     jz    hvp_yok
  132.     dec    ax        ; Convert to zero-based coordinates.
  133. hvp_yok:mov    cur_y, al
  134.     ; Get second parameter, if it is there, and set X with it.
  135.     xor    ax, ax
  136.     cmp    cx, 2        ; was there a second parameter?
  137.     jb    hvp_xok
  138.     lodsb            ; yes.
  139.     or    al, al
  140.     jz    hvp_xok
  141.     dec    ax        ; convert to zero-based coordinates.
  142. hvp_xok:mov    cur_x, al
  143.  
  144.     ; Clip to maximum coordinates.
  145. hvp_set:
  146.  
  147.     mov    ax, cur_coords        ; al = x, ah = y
  148.     cmp    al, max_x
  149.     jbe    hvp_sxok
  150.         mov    al, max_x
  151.         mov    cur_x, al
  152. hvp_sxok:
  153.     cmp    ah, max_y
  154.     jbe    hvp_syok
  155.         mov    al, max_y
  156.         mov    cur_y, al
  157. hvp_syok:
  158.     ; Set values of DX and DI accordingly.
  159.     call    xy_to_regs
  160.     ret
  161.  
  162. ;-- cursor forward --
  163. cfw:    add    cur_x, al
  164.     jmp    hvp_set
  165.  
  166. ;-- cursor back -----
  167. cbk:    sub    cur_x, al
  168.  
  169.     jae    cbk_ok
  170.         mov    cur_x, 0
  171. cbk_ok: jmp    hvp_set
  172.  
  173. ;-- cursor down -----
  174. cdn:    add    cur_y, al
  175.     jmp    hvp_set
  176.  
  177. ;-- cursor up -------
  178. cup:    sub    cur_y, al
  179.     jae    cup_ok
  180.         mov    cur_y, 0
  181. cup_ok: jmp    hvp_set
  182.  
  183. ;-- save cursor position --------------------------------------
  184. scp:    mov    ax, cur_coords
  185.     mov    saved_coords, ax
  186.     ret
  187.  
  188. ;-- restore cursor position -----------------------------------
  189. rcp:    mov    ax, saved_coords
  190.  
  191.     mov    cur_coords, ax
  192.     jmp    hvp_set        ; Clip in case we have switched video modes.
  193.  
  194. ;-- set graphics rendition ------------------------------------
  195. ; Modifies the color in which new characters are written.
  196.  
  197. sgr:    dec    si        ; get back pointer to first parameter
  198.     or    cx, cx        ; Did he give any parameters?
  199.     jnz    sgr_loop
  200.         mov    byte ptr [si], 0    ; no parameters, so fake
  201.         inc    cx            ; one with the default value.
  202.     ; For each parameter
  203. sgr_loop:
  204.         lodsb                ; al = next parameter
  205.         ; Search color table
  206.         push    cx
  207.         mov    cx, colors
  208.         mov    bx, offset color_table-3
  209. sgr_search:
  210.             add    bx, 3
  211.             cmp    al, byte ptr [bx]
  212.  
  213.             loopnz    sgr_search    ; until match found or done
  214.         jnz    sgr_loopx
  215.  
  216.         ; If parameter named a known color, set the current
  217.         ; color variable.
  218.         mov    ax, [bx+1]
  219.         and    cur_attrib, al
  220.         or    cur_attrib, ah
  221. sgr_loopx:
  222.         pop    cx
  223.         loop    sgr_loop        ; until no more parameters.
  224.     ret
  225.  
  226. ;-- erase in line ----------------------------------------
  227. ; Uses BIOS to scroll away a one-line rectangle
  228. eil:    push    dx
  229.     mov    cx, cur_coords
  230.     mov    dh, ch
  231.     jmp    short scrollem
  232.  
  233. ;-- erase in display -------------------------------------
  234.  
  235. ; Uses BIOS to scroll away all of display
  236. eid:    cmp    al, 2
  237. ;    jnz    eid_ignore    ; param must be two (accept all for now CRH
  238.     if    cls_homes_too
  239.         mov    cur_coords, 0
  240.         call    xy_to_regs
  241.     endif
  242.     push    dx
  243.     xor    cx, cx
  244.     mov    dh, max_y
  245. scrollem:
  246.     call    get_blank_attrib
  247.     mov    bh, ah
  248.     mov    dl, max_x
  249.     mov    ax, 600h
  250.     int    10h
  251.     pop    dx
  252. eid_ignore:
  253.     ret
  254.  
  255. ;-- device status report --------------------------------
  256.  
  257. ; Stuffs an escape, a left bracket, current Y, semicolon, current X,
  258. ; a capital R, and a carriage return into input stream.
  259. ; The coordinates are 1 to 3 decimal digits each.
  260.  
  261. dsr:    push    di
  262.     push    dx
  263.     push    es
  264.     mov    ax, cs
  265.     mov    es, ax
  266.     std            ; Store string in reversed order for fun
  267.     mov    di, offset cpr_esc - 2
  268.     mov    al, cur_y
  269.     inc    al        ; convert to one-based coords
  270.     call    byteout        ; row
  271.     mov    al, ';'        ; ;
  272.     stosb
  273.     mov    al, cur_x
  274.     inc    al        ; convert to one-based coords
  275.     call    byteout        ; column
  276.     mov    al, 'R'        ; R ANSI function 'Cursor Position Report'
  277.     stosb
  278.  
  279.     mov    al, 13
  280.     mov    word ptr cprseq.adr, di ; save pointer to last char in string
  281.     stosb                ; send a carriage return, too
  282.     mov    ax, offset cpr_esc
  283.     sub    ax, di            ; ax is # of characters in string
  284.     mov    word ptr cprseq.len, ax ; pass info to the getchar routine
  285.     cld
  286.     pop    es
  287.     pop    dx
  288.     pop    di
  289.     ret
  290.  
  291. ;-- keyboard reassignment -------------------------------
  292. ; Key reassignment buffer is between param_end and redef_end+2, exclusive.
  293. ; When it shrinks or grows, param_end is moved.
  294. ; Format of an entry is as follows:
  295. ;   highest address -> length:word (may be 0)
  296. ;               key to replace:word     (either hi or low byte is zero)
  297. ;               .
  298. ;               .    new key value, "length" bytes long
  299. ;               .
  300.  
  301. ;   lowest address  -> next entry, or free space.
  302. ; If no arguments are given, keyboard is reset to default condition.
  303. ; Otherwise, first parameter (or first two, if first is zero) defines
  304. ; the key whose value is to be changed, and the following parameters
  305. ; define the key's new, possibly zero-length, value.
  306.  
  307. key:
  308.     ; Is this a reset?
  309.     or    cx, cx
  310.     jz    key_init
  311.     ; Get the first (or first two) parameters
  312.     cld
  313.     dec    si    ; point to first param
  314.     dec    cx    ; Assume it's a fn key, get two params
  315.     dec    cx
  316.     lodsw
  317.     or    al, al    ; Is it a function key?
  318.     jz    key_fnkey
  319.         ; It's not a function key- put second param back
  320.         inc    cx
  321.         dec    si
  322.  
  323. key_fnkey:
  324.     ; Key to redefine now in AX.  If it's already redefined,
  325.     ; lookup will set Z, point SI to redef string, set CX to its length.
  326.     push    di
  327.     push    es
  328.     push    cx
  329.     push    si
  330.  
  331.     std            ; moving up, must move from top down
  332.     push    ds
  333.     pop    es        ; string move must have ES=DS
  334.     call    lookup        ; rets Z if redefined...
  335.     jnz    key_newkey
  336.     ; It's already defined.  Erase its old definition- i.e., move
  337.     ; region param_end+1..SI-1 upwards CX+4 bytes, add CX+4 to param_end.
  338.     add    cx, 4
  339.     mov    bp, param_end    ; save old value in bp...
  340.     add    param_end, cx
  341.     dec    si        ; start at (SI-1)
  342.     mov    di, si
  343.     add    di, cx        ; move to (start + CX+4)
  344.  
  345.     mov    cx, si
  346.     sub    cx, bp        ; length of region old_param_end+1..start
  347.     rep    movsb
  348. key_newkey:
  349.     ; Key not redefined.  See if there's enough room to redefine it.
  350.     pop    si        ; get back pointer to redef string
  351.     pop    cx        ; get back number of bytes in redef string
  352.     mov    di, param_end    ; hi byte of new redef record, hi byte of len
  353.     sub    di, 4        ; hi byte of new data field
  354.     mov    bx, di
  355.     sub    bx, cx        ; hi byte of remaining buffer space
  356.     sub    bx, 16        ; better be at least 16 bytes room
  357.     cmp    bx, param_buffer
  358.     jb    key_popem    ; nope- forget it.
  359.     ; Nothing in the way now!
  360.     mov    [di+3], cx    ; save length field
  361.     mov    [di+1], ax    ; save name field
  362.     jcxz    key_nullstring
  363. key_saveloop:            ; save data field
  364.     movsb
  365.     add    si, 2        ; input string ascending, output descending
  366.  
  367.     loop    key_saveloop
  368. key_nullstring:
  369.     mov    param_end, di    ; save adr of new hi byte of free area
  370. key_popem:
  371.     pop    es
  372.     pop    di
  373.  
  374. key_exit:
  375.     cld
  376.     ret
  377.  
  378. key_init:
  379.     ; Build the default redefinition table:
  380.     ;    control-printscreen -> control-P
  381.     push    es
  382.     push    ds
  383.     pop    es
  384.     std
  385.     mov    di, redef_end
  386.     mov    ax, 1
  387.     stosw
  388.  
  389.     mov    ax, 7200h    ; control-printscreen
  390.     stosw
  391.     mov    al, 16        ; control P
  392.     stosb
  393.     mov    param_end, di    ; save new bottom of redef table
  394.     pop    es
  395.     jmp    key_exit
  396.  
  397. ;---- Delete/Insert Lines -------------------------------
  398. ; AL is number of lines to delete/insert.
  399. ; Preserves DX, DI; does not move cursor.
  400.  
  401. d_l:    ; Delete lines.
  402.     mov    ah, 6            ; BIOS: scroll up
  403.     jmp    short il_open
  404.  
  405. il:    ; Insert lines.
  406.     mov    ah, 7            ; BIOS: scroll down
  407.  
  408. il_open:
  409.     ; Whether inserting or deleting, limit him to (max_y - cur_y) lines;
  410.  
  411.     ; if above that, we're just clearing; set AL=0 so BIOS doesn't burp.
  412.     mov    bh, max_y
  413.     sub    bh, cur_y
  414.     cmp    al, bh
  415.     jbe    il_ok            ; DRK 9/4...
  416.         mov    al, 0        ; he tried to move too far
  417. il_ok:
  418.     push    ax
  419.     call    get_blank_attrib
  420.     mov    bh, ah            ; color to use on new blank areas
  421.     pop    ax            ; AL is number of lines to scroll.
  422.  
  423.     mov    cl, 0            ; upper-left-x of data to scroll
  424.     mov    ch, cur_y        ; upper-left-y of data to scroll
  425.     push    dx
  426.     mov    dl, max_x        ; lower-rite-x
  427.     mov    dh, max_y        ; lower-rite-y (zero based)
  428.     int    10h            ; call BIOS to scroll a rectangle.
  429.     pop    dx
  430.     ret                ; done.
  431.  
  432.  
  433. ;-- Insert / Delete Characters ----------------------------
  434. ; AL is number of characters to insert or delete.
  435. ; Preserves DX, DI; does not move cursor.
  436.  
  437. ic:    mov    ch, 1            ; 1 => swap dest & source below
  438.     jmp    short dc_ch
  439.  
  440. dc:    mov    ch, 0
  441.  
  442. dc_ch:
  443.     call    in_g_mode
  444.     jnc    dc_ret            ; | if in graphics mode, ignore.
  445.  
  446.     ; AL = number of chars to ins or del (guarenteed nonzero).
  447.     ; Limit him to # of chars left on line.
  448.     cmp    al, dl
  449.     jbe    dc_cok
  450.         mov    al, dl
  451. dc_cok:
  452.     push    di            ; DI is current address of cursor
  453.     xchg    ax, cx            ; CX gets # of chars to ins/del
  454.  
  455.     mov    bp, cx            ; BP gets # of columns to clear.
  456.  
  457.     ; Set up source = destination + cx*2, count = dx - cx
  458.     mov    ch, 0            ; make it a word
  459.     mov    si, di
  460.     add    si, cx
  461.     add    si, cx
  462.     neg    cl
  463.     add    cl, dl
  464.     mov    ch, 0            ; CX = # of words to transfer
  465.     cld                ; REP increments si & di
  466.  
  467.     ; If this is an insert, then flip transfer around in both ways.
  468.     test    ah, 1
  469.     jz    dc_noswap
  470.         xchg    di, si        ; source <-> dest
  471.         std            ; up <-> down
  472.         mov    ax, cx        ; make move over same range
  473.         dec    ax
  474.         add    ax, ax        ; AX=dist from 1st to last byte.
  475.         add    di, ax        ; Start transfer at high end of block
  476.  
  477.         add    si, ax        ;  instead of low end.
  478. dc_noswap:
  479.     ; Move those characters.
  480.     push    es
  481.     pop    ds
  482.     rep    movsw
  483.     mov    cx, bp
  484.     ; Figure out what color to make the new blanks.
  485.     call    get_blank_attrib
  486.     mov    al, ' '
  487.     ; Blank out vacated region.
  488.     rep    stosw
  489.  
  490.     ; All done.
  491.     cld                ; restore normal REP state and
  492.     pop    di            ;  cursor address.
  493. dc_ret: ret
  494.  
  495.  
  496. ;---- set / reset mode ---------------------------------------
  497. ; Sets graphics/text mode; also sets/resets "no wrap at eol" mode.
  498.  
  499. sm:    mov    cl, 0ffh    ; set
  500. sm_rs:
  501.     ; Is it "wrap at eol" ?
  502.     cmp    al, 7
  503.     jnz    sm_notwrap
  504.         mov    wrap_flag, cl    ; true = wrap at EOL
  505.         jmp    short sm_done
  506. sm_notwrap:
  507.     ; Is it "set highest number of screen lines available"?
  508.     cmp    al, 43
  509.     jnz    sm_video
  510.         ; Only valid for the Enhanced Graphics Adaptor on
  511.         ; a monochrome display or an enhanced color display.
  512.         ; Test presence of EGA by calling BIOS fn 12h.10h.
  513.         mov    ah, 12h
  514.         mov    bx, 0ff10h
  515.         int    10h            ; bh=0-1, bl=0-3 if EGA
  516.         test    bx, 0FEFCH
  517.         jnz    sm_done            ; sorry, charlie
  518. ;        mov    port_6845, 3d4h
  519. ;        mov    al, video_mode
  520.  
  521. ;        and    al, 7
  522. ;        cmp    al, 7            ; monochrome monitor?
  523. ;        jnz    sm_colormon
  524. ;            mov    byte ptr port_6845, low(3b4h)
  525. ;sm_colormon:
  526.         ; 43 line mode only allowed in text modes, for now.
  527.         call    in_g_mode
  528.         jnc    sm_done
  529.  
  530.         mov    ah, 0            ; "Set video mode"
  531.         mov    al, video_mode        ; Re-init current mode
  532.         int    10h
  533.  
  534.         mov    ax,1112h        ; Load 8x8 font
  535.         mov    bl,0            ; (instead of 8x14)
  536.         int    10h
  537.  
  538.         mov    ax, 1200h        ; Load new printscreen
  539.         mov    bl, 20h
  540.         int    10h
  541.  
  542.  
  543.         mov    ah,1
  544.         mov    cx,0707h        ; (Load cursor scan lines)
  545.         int    10h
  546.         ; | Patch; this gotten by painful observation of
  547.         ; | IBM's professional editor.    I think there's a
  548.         ; | documented bug in Video Bios's "load cursor scan line"
  549.         ; | call; try looking in latter 1985 PC Tech Journal.
  550.         mov    dx, port_6845        ; '6845' command reg
  551.         mov    al, 10
  552.         out    dx, al
  553.         jmp    $+2
  554.         inc    dx
  555.         mov    al, 7
  556.         out    dx, al            ; set cursor start line
  557.         ; Assume that gets us 43 lines.
  558.         mov    max_y, 42
  559.         jmp    short sm_home
  560. sm_video:
  561.     ; It must be a video mode.  Call BIOS.
  562.     mov    ah, 0        ; "set video mode"
  563.     int    10h
  564.  
  565.     ; Assume that gets us 25 lines.
  566.     mov    max_y, 24
  567. sm_home:
  568.     ; Read the BIOS buffer address/cursor position variables.
  569.     mov    ax, abs40
  570.     push    ds
  571.     mov    ds, ax
  572.     assume    ds:abs40
  573.     ; Find current video mode and screen size.
  574.     mov    ax,word ptr crt_mode    ; al = crt mode; ah = # of columns
  575.     pop    ds
  576.     mov    video_mode, al
  577.     dec    ah            ; ah = max column
  578.     mov    max_x, ah
  579.  
  580.     ; Since cursor may end up in illegal position, it's best to
  581.     ; just go home after switching video modes.
  582.     mov    cur_coords, 0
  583.     call    xy_to_regs
  584. sm_done:
  585.     ret
  586.  
  587.  
  588. rm:    mov    cl, 0        ; reset
  589.     jmp    sm_rs
  590.  
  591. ;------- Output Character Translation ----------------------
  592. ; A decidedly nonstandard function, possibly useful for editing files
  593. ; intended to be printed by daisywheel printers with strange wheels.
  594. ; (The letter 'y' was chosen to conflict with the VT100 self-test command.)
  595. ; Usage: ESC [ #1;#2 y
  596. ; where #1 is the character to redefine
  597. ;    #2 is the new display value
  598. ; If only ESC [ #1 y is sent, character #1 is reset to its default value.
  599. ; If only ESC [ y is sent, the entire table is reset to the default value.
  600. ; (If only ESC [ #1; y is sent, character #1 is set to zero... sigh.)
  601.  
  602. xoc:    ; Xlate output character
  603.     mov    bx, xlate_tab_ptr
  604.     jcxz    xoc_reset    ; if no parameters, reset table to 1:1
  605.     dec    si        ; point to first parameter
  606.     lodsw            ; first parameter to AL, second to AH
  607.     dec    cx        ; is parameter count 1?
  608.  
  609.     jnz    xoc_bothparams
  610.         mov    ah, al    ; if only one param, reset that char.
  611. xoc_bothparams:
  612.     add    bl, al
  613.     adc    bh, 0        ; bx points to entry for char AL
  614.     mov    byte ptr [bx], ah    ; change that entry
  615. xoc_done:
  616.     ret
  617.  
  618. xoc_reset:
  619.     ; Fill table with default values- i.e. 0, 1, 2, ... 255.
  620.     xor    ax, ax
  621. xoc_loop:
  622.     mov    byte ptr [bx], al
  623.     inc    bx
  624.     inc    al
  625.     jnz    xoc_loop
  626.     jmp    xoc_done
  627.  
  628. ansi_functions    endp    ; end dummy procedure block
  629.  
  630.  
  631.  
  632.  
  633. ;-------- Color table -----------------------------------------
  634. ; Used in "set graphics rendition"
  635. colors    equ    22            ; number of colors in table
  636. color_table:
  637.     db    0, 000h,07h        ; all attribs off; normal.
  638.     db    1, 0ffh,08h        ; bold
  639.     db    4, 0f8h,01h        ; underline
  640.     db    5, 0ffh,80h        ; blink
  641.     db    7, 0f8h,70h        ; reverse
  642.     db    8, 088h,00h        ; invisible
  643.  
  644.     db    30,0f8h,00h        ; black foreground
  645.     db    31,0f8h,04h        ; red
  646.     db    32,0f8h,02h        ; green
  647.     db    33,0f8h,06h        ; yellow
  648.     db    34,0f8h,01h        ; blue
  649.     db    35,0f8h,05h        ; magenta
  650.     db    36,0f8h,03h        ; cyan
  651.     db    37,0f8h,07h        ; white
  652.  
  653.  
  654.     db    40,08fh,00h        ; black background
  655.     db    41,08fh,40h        ; red
  656.     db    42,08fh,20h        ; green
  657.     db    43,08fh,60h        ; yellow
  658.     db    44,08fh,10h        ; blue
  659.     db    45,08fh,50h        ; magenta
  660.     db    46,08fh,30h        ; cyan
  661.     db    47,08fh,70h        ; white
  662.  
  663.  
  664. code    ends
  665.     end                ; of nansi_f.asm
  666.  
  667.